library(readr)
library(broom)
library(dplyr)
library(ggplot2)
library(plotly)
library(magick)
library(readxl)
# Read CSV file
my_data <- read_csv("C:/Users/Custom/Documents/CBB/Reg Model CSV.csv", show_col_types = FALSE)

# Fit the regression model
model <- lm(Outcome ~ OppPPG + ORPG + DRPG + `3P%` + `3PAR` + `NP%` + NPAR + TOV + FTAR + `FT%` + OppTOV + PPSt + PPSC, data = my_data)
# Round coefficients, standard errors, and p-values
tidy_model <- tidy(model, conf.int = TRUE) %>%
  mutate(estimate = round(estimate, 2),
         std.error = round(std.error, 2),
         conf.low = round(conf.low, 2),
         conf.high = round(conf.high, 2),
         statistic = round(statistic, 2),
         p.value = round(p.value, 2))

model_summary <- summary(model)
rsquared <- model_summary$r.squared
cat("R-squared:", round(rsquared, 3), "\n")
R-squared: 0.313 
# Print rounded coefficients, standard errors, and p-values with all rows and columns
print(tidy_model, n = Inf, width = Inf)
library(ggplot2)
library(ggimage)

team_data <- read.csv("C:/Users/Custom/Documents/CBB/teamgraph.csv")
team_data$Logo <- paste0("C:/Users/Custom/Documents/CBB/webplogos/", team_data$Team, ".webp")
team_data$LogoExists <- file.exists(team_data$Logo)
team_data_with_logos <- team_data[team_data$LogoExists, ]
p <- ggplot(team_data_with_logos, aes(x = NetEff, y = Aura)) +
  geom_image(aes(image = Logo), size = 0.05) +
  theme_minimal() +
  labs(title = "Team Performance Scatterplot",
       x = "Net Efficiency (NetEff)",
       y = "Aura")
print(p)

library(readxl)
library(plotly)
library(magick)

data <- read_excel("C:/Users/Custom/Documents/CBB/fullstats.xlsx")
New names:
data$Logo <- normalizePath(trimws(data$Logo), winslash = "/")

missing_files <- !file.exists(data$Logo)
if (any(missing_files)) {
  print("Missing files:")
  print(data$Logo[missing_files])
} else {
  print("All files exist.")
}
[1] "All files exist."
p <- plot_ly(data, x = ~AdjT, y = ~`3PAR`, z = ~`3P%`, 
             type = "scatter3d", mode = "markers", 
             marker = list(size = 5, color = "black"),  # Change marker color to black
             text = ~paste("Team: ", Team),  # Add team names as hover text
             hoverinfo = "text",
             hovertemplate = paste(
               "<b>%{text}</b><br>",  # Team name in bold
               "<span style='color: red;'>AdjT: %{x}</span><br>",  # AdjT in red
               "<span style='color: red;'>3PAR: %{y}</span><br>",  # 3PAR in red
               "<span style='color: red;'>3P%: %{z}</span><br>",    # 3P% in red
               "<extra></extra>"  # Remove extra hover info
             ))

for (i in 1:nrow(data)) {
  tryCatch({
    if (!file.exists(data$Logo[i])) {
      warning(paste("File not found:", data$Logo[i]))
      next
    }
    
    logo <- image_read(data$Logo[i])
    logo <- image_resize(logo, "50x50")  # Resize the logo if needed
    
    p <- p %>%
      add_trace(x = data$AdjT[i], y = data$`3PAR`[i], z = data$`3P%`[i],
                type = "scatter3d", mode = "markers",
                marker = list(symbol = 'circle', size = 10, 
                              color = 'rgba(0, 0, 0, 0)',  # Transparent marker
                              opacity = 0),
                hoverinfo = "none",
                showlegend = FALSE,
                name = data$Team[i],
                customdata = data$Logo[i],
                hovertemplate = paste(
                  "<b>", data$Team[i], "</b><br>",  # Team name in bold
                  "<span style='color: red;'>AdjT: ", data$AdjT[i], "</span><br>",  # AdjT in red
                  "<span style='color: red;'>3PAR: ", data$`3PAR`[i], "</span><br>",  # 3PAR in red
                  "<span style='color: red;'>3P%: ", data$`3P%`[i], "</span><br>",    # 3P% in red
                  "<extra></extra>"  # Remove extra hover info
                ))
  }, error = function(e) {
    message(paste("Error with file:", data$Logo[i]))
    message(e$message)
  })
}

p <- p %>%
  layout(
    scene = list(
      xaxis = list(
        title = "AdjT",
        tickmode = "linear",
        dtick = 5,        
        range = c(60, 75)   
      ),
      yaxis = list(
        title = "3PAR"
      ),
      zaxis = list(
        title = "3P%"
      )
    )
  )

p
library(readxl)
library(ggplot2)
library(ggimage)

data <- read_excel("C:/Users/Custom/Documents/CBB/fullstats.xlsx")
New names:
data$Logo <- normalizePath(trimws(data$Logo), winslash = "/")

missing_files <- !file.exists(data$Logo)
if (any(missing_files)) {
  print("Missing files:")
  print(data$Logo[missing_files])
} else {
  print("All files exist.")
}
[1] "All files exist."
p <- ggplot(data, aes(x = `Aura`, y = `TOVDiff`)) +
  geom_image(aes(image = Logo), size = 0.07) + 
  labs(
    x = "Aura",
    y = "TOVDiff",
    title = "Aura vs TOVDiff" 
  ) +
  theme(
    panel.background = element_rect(fill = "white"),
    plot.background = element_rect(fill = "white"),
    
    axis.line = element_line(color = "black"),
    axis.text = element_text(color = "black", size = 12),
    axis.title = element_text(color = "black", size = 12),
    
    plot.title = element_text(color = "black", size = 12, face = "bold", hjust = 0.5),
    
    panel.grid.major = element_line(color = "gray90"),  # Light gray grid lines
    panel.grid.minor = element_blank()  # Remove minor grid lines
  )

print(p)

ggsave(
  filename = "Aura vs TOVDiff.png", 
  plot = p,                          
  device = "png",                    
  width = 10,                        
  height = 8,                       
  dpi = 300                         
)

library(dplyr)

data <- read_excel("C:/Users/Custom/Documents/CBB/fullstats.xlsx")
New names:
x_bar <- mean(data$`Aura`, na.rm = TRUE)
y_bar <- mean(data$`TOVDiff`, na.rm = TRUE)

data <- data %>%
  mutate(
    x_diff = `Aura` - x_bar,
    y_diff = `TOVDiff` - y_bar,  
    score = sign(x_diff + y_diff) * sqrt(x_diff^2 + y_diff^2),
    score_rounded = round(score, 1),
    across(where(is.numeric), ~ round(., 1))
  )

score_table <- data %>%
  select(Team, Aura, TOVDiff, score_rounded)

write.csv(score_table, "C:/Users/Custom/Documents/CBB/team_scores.csv", row.names = FALSE)
LS0tDQp0aXRsZTogIkpvcmRhbiBGcmFuY28gQ0JCIDIwMjUiDQpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sNCi0tLQ0KYGBge3J9DQpsaWJyYXJ5KHJlYWRyKQ0KbGlicmFyeShicm9vbSkNCmxpYnJhcnkoZHBseXIpDQpsaWJyYXJ5KGdncGxvdDIpDQpsaWJyYXJ5KHBsb3RseSkNCmxpYnJhcnkobWFnaWNrKQ0KbGlicmFyeShyZWFkeGwpDQpgYGANCg0KYGBge3J9DQpteV9kYXRhIDwtIHJlYWRfY3N2KCJDOi9Vc2Vycy9DdXN0b20vRG9jdW1lbnRzL0NCQi9SZWcgTW9kZWwgQ1NWLmNzdiIsIHNob3dfY29sX3R5cGVzID0gRkFMU0UpDQptb2RlbCA8LSBsbShPdXRjb21lIH4gT3BwUFBHICsgT1JQRyArIERSUEcgKyBgM1AlYCArIGAzUEFSYCArIGBOUCVgICsgTlBBUiArIFRPViArIEZUQVIgKyBgRlQlYCArIE9wcFRPViArIFBQU3QgKyBQUFNDLCBkYXRhID0gbXlfZGF0YSkNCnRpZHlfbW9kZWwgPC0gdGlkeShtb2RlbCwgY29uZi5pbnQgPSBUUlVFKSAlPiUNCiAgbXV0YXRlKGVzdGltYXRlID0gcm91bmQoZXN0aW1hdGUsIDIpLA0KICAgICAgICAgc3RkLmVycm9yID0gcm91bmQoc3RkLmVycm9yLCAyKSwNCiAgICAgICAgIGNvbmYubG93ID0gcm91bmQoY29uZi5sb3csIDIpLA0KICAgICAgICAgY29uZi5oaWdoID0gcm91bmQoY29uZi5oaWdoLCAyKSwNCiAgICAgICAgIHN0YXRpc3RpYyA9IHJvdW5kKHN0YXRpc3RpYywgMiksDQogICAgICAgICBwLnZhbHVlID0gcm91bmQocC52YWx1ZSwgMikpDQptb2RlbF9zdW1tYXJ5IDwtIHN1bW1hcnkobW9kZWwpDQpyc3F1YXJlZCA8LSBtb2RlbF9zdW1tYXJ5JHIuc3F1YXJlZA0KY2F0KCJSLXNxdWFyZWQ6Iiwgcm91bmQocnNxdWFyZWQsIDMpLCAiXG4iKQ0KDQpwcmludCh0aWR5X21vZGVsLCBuID0gSW5mLCB3aWR0aCA9IEluZikNCmBgYA0KDQpgYGB7cn0NCmxpYnJhcnkoZ2dpbWFnZSkNCg0KdGVhbV9kYXRhIDwtIHJlYWQuY3N2KCJDOi9Vc2Vycy9DdXN0b20vRG9jdW1lbnRzL0NCQi90ZWFtZ3JhcGguY3N2IikNCnRlYW1fZGF0YSRMb2dvIDwtIHBhc3RlMCgiQzovVXNlcnMvQ3VzdG9tL0RvY3VtZW50cy9DQkIvd2VicGxvZ29zLyIsIHRlYW1fZGF0YSRUZWFtLCAiLndlYnAiKQ0KdGVhbV9kYXRhJExvZ29FeGlzdHMgPC0gZmlsZS5leGlzdHModGVhbV9kYXRhJExvZ28pDQp0ZWFtX2RhdGFfd2l0aF9sb2dvcyA8LSB0ZWFtX2RhdGFbdGVhbV9kYXRhJExvZ29FeGlzdHMsIF0NCnAgPC0gZ2dwbG90KHRlYW1fZGF0YV93aXRoX2xvZ29zLCBhZXMoeCA9IE5ldEVmZiwgeSA9IEF1cmEpKSArDQogIGdlb21faW1hZ2UoYWVzKGltYWdlID0gTG9nbyksIHNpemUgPSAwLjA1KSArDQogIHRoZW1lX21pbmltYWwoKSArDQogIGxhYnModGl0bGUgPSAiVGVhbSBQZXJmb3JtYW5jZSBTY2F0dGVycGxvdCIsDQogICAgICAgeCA9ICJOZXQgRWZmaWNpZW5jeSAoTmV0RWZmKSIsDQogICAgICAgeSA9ICJBdXJhIikNCnByaW50KHApDQpgYGANCg0KYGBge3J9DQpkYXRhIDwtIHJlYWRfZXhjZWwoIkM6L1VzZXJzL0N1c3RvbS9Eb2N1bWVudHMvQ0JCL2Z1bGxzdGF0cy54bHN4IikNCg0KZGF0YSRMb2dvIDwtIG5vcm1hbGl6ZVBhdGgodHJpbXdzKGRhdGEkTG9nbyksIHdpbnNsYXNoID0gIi8iKQ0KDQptaXNzaW5nX2ZpbGVzIDwtICFmaWxlLmV4aXN0cyhkYXRhJExvZ28pDQppZiAoYW55KG1pc3NpbmdfZmlsZXMpKSB7DQogIHByaW50KCJNaXNzaW5nIGZpbGVzOiIpDQogIHByaW50KGRhdGEkTG9nb1ttaXNzaW5nX2ZpbGVzXSkNCn0gZWxzZSB7DQogIHByaW50KCJBbGwgZmlsZXMgZXhpc3QuIikNCn0NCnAgPC0gcGxvdF9seShkYXRhLCB4ID0gfkFkalQsIHkgPSB+YDNQQVJgLCB6ID0gfmAzUCVgLCANCiAgICAgICAgICAgICB0eXBlID0gInNjYXR0ZXIzZCIsIG1vZGUgPSAibWFya2VycyIsIA0KICAgICAgICAgICAgIG1hcmtlciA9IGxpc3Qoc2l6ZSA9IDUsIGNvbG9yID0gImJsYWNrIiksDQogICAgICAgICAgICAgdGV4dCA9IH5wYXN0ZSgiVGVhbTogIiwgVGVhbSksDQogICAgICAgICAgICAgaG92ZXJpbmZvID0gInRleHQiLA0KICAgICAgICAgICAgIGhvdmVydGVtcGxhdGUgPSBwYXN0ZSgNCiAgICAgICAgICAgICAgICI8Yj4le3RleHR9PC9iPjxicj4iLCAgIyBUZWFtIG5hbWUgaW4gYm9sZA0KICAgICAgICAgICAgICAgIjxzcGFuIHN0eWxlPSdjb2xvcjogcmVkOyc+QWRqVDogJXt4fTwvc3Bhbj48YnI+IiwNCiAgICAgICAgICAgICAgICI8c3BhbiBzdHlsZT0nY29sb3I6IHJlZDsnPjNQQVI6ICV7eX08L3NwYW4+PGJyPiIsDQogICAgICAgICAgICAgICAiPHNwYW4gc3R5bGU9J2NvbG9yOiByZWQ7Jz4zUCU6ICV7en08L3NwYW4+PGJyPiIsDQogICAgICAgICAgICAgICAiPGV4dHJhPjwvZXh0cmE+Ig0KICAgICAgICAgICAgICkpDQoNCmZvciAoaSBpbiAxOm5yb3coZGF0YSkpIHsNCiAgdHJ5Q2F0Y2goew0KICAgIGlmICghZmlsZS5leGlzdHMoZGF0YSRMb2dvW2ldKSkgew0KICAgICAgd2FybmluZyhwYXN0ZSgiRmlsZSBub3QgZm91bmQ6IiwgZGF0YSRMb2dvW2ldKSkNCiAgICAgIG5leHQNCiAgICB9DQogICAgDQogICAgbG9nbyA8LSBpbWFnZV9yZWFkKGRhdGEkTG9nb1tpXSkNCiAgICBsb2dvIDwtIGltYWdlX3Jlc2l6ZShsb2dvLCAiNTB4NTAiKQ0KICAgIA0KICAgIHAgPC0gcCAlPiUNCiAgICAgIGFkZF90cmFjZSh4ID0gZGF0YSRBZGpUW2ldLCB5ID0gZGF0YSRgM1BBUmBbaV0sIHogPSBkYXRhJGAzUCVgW2ldLA0KICAgICAgICAgICAgICAgIHR5cGUgPSAic2NhdHRlcjNkIiwgbW9kZSA9ICJtYXJrZXJzIiwNCiAgICAgICAgICAgICAgICBtYXJrZXIgPSBsaXN0KHN5bWJvbCA9ICdjaXJjbGUnLCBzaXplID0gMTAsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3IgPSAncmdiYSgwLCAwLCAwLCAwKScsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGFjaXR5ID0gMCksDQogICAgICAgICAgICAgICAgaG92ZXJpbmZvID0gIm5vbmUiLA0KICAgICAgICAgICAgICAgIHNob3dsZWdlbmQgPSBGQUxTRSwNCiAgICAgICAgICAgICAgICBuYW1lID0gZGF0YSRUZWFtW2ldLA0KICAgICAgICAgICAgICAgIGN1c3RvbWRhdGEgPSBkYXRhJExvZ29baV0sDQogICAgICAgICAgICAgICAgaG92ZXJ0ZW1wbGF0ZSA9IHBhc3RlKA0KICAgICAgICAgICAgICAgICAgIjxiPiIsIGRhdGEkVGVhbVtpXSwgIjwvYj48YnI+IiwNCiAgICAgICAgICAgICAgICAgICI8c3BhbiBzdHlsZT0nY29sb3I6IHJlZDsnPkFkalQ6ICIsIGRhdGEkQWRqVFtpXSwgIjwvc3Bhbj48YnI+IiwNCiAgICAgICAgICAgICAgICAgICI8c3BhbiBzdHlsZT0nY29sb3I6IHJlZDsnPjNQQVI6ICIsIGRhdGEkYDNQQVJgW2ldLCAiPC9zcGFuPjxicj4iLA0KICAgICAgICAgICAgICAgICAgIjxzcGFuIHN0eWxlPSdjb2xvcjogcmVkOyc+M1AlOiAiLCBkYXRhJGAzUCVgW2ldLCAiPC9zcGFuPjxicj4iLCAgDQogICAgICAgICAgICAgICAgICAiPGV4dHJhPjwvZXh0cmE+IiANCiAgICAgICAgICAgICAgICApKQ0KICB9LCBlcnJvciA9IGZ1bmN0aW9uKGUpIHsNCiAgICBtZXNzYWdlKHBhc3RlKCJFcnJvciB3aXRoIGZpbGU6IiwgZGF0YSRMb2dvW2ldKSkNCiAgICBtZXNzYWdlKGUkbWVzc2FnZSkNCiAgfSkNCn0NCg0KcCA8LSBwICU+JQ0KICBsYXlvdXQoDQogICAgc2NlbmUgPSBsaXN0KA0KICAgICAgeGF4aXMgPSBsaXN0KA0KICAgICAgICB0aXRsZSA9ICJBZGpUIiwNCiAgICAgICAgdGlja21vZGUgPSAibGluZWFyIiwNCiAgICAgICAgZHRpY2sgPSA1LCAgICAgICAgDQogICAgICAgIHJhbmdlID0gYyg2MCwgNzUpICAgDQogICAgICApLA0KICAgICAgeWF4aXMgPSBsaXN0KA0KICAgICAgICB0aXRsZSA9ICIzUEFSIg0KICAgICAgKSwNCiAgICAgIHpheGlzID0gbGlzdCgNCiAgICAgICAgdGl0bGUgPSAiM1AlIg0KICAgICAgKQ0KICAgICkNCiAgKQ0KDQpwDQpgYGANCmBgYHtyfQ0KZGF0YSA8LSByZWFkX2V4Y2VsKCJDOi9Vc2Vycy9DdXN0b20vRG9jdW1lbnRzL0NCQi9mdWxsc3RhdHMueGxzeCIpDQpkYXRhJExvZ28gPC0gbm9ybWFsaXplUGF0aCh0cmltd3MoZGF0YSRMb2dvKSwgd2luc2xhc2ggPSAiLyIpDQoNCm1pc3NpbmdfZmlsZXMgPC0gIWZpbGUuZXhpc3RzKGRhdGEkTG9nbykNCmlmIChhbnkobWlzc2luZ19maWxlcykpIHsNCiAgcHJpbnQoIk1pc3NpbmcgZmlsZXM6IikNCiAgcHJpbnQoZGF0YSRMb2dvW21pc3NpbmdfZmlsZXNdKQ0KfSBlbHNlIHsNCiAgcHJpbnQoIkFsbCBmaWxlcyBleGlzdC4iKQ0KfQ0KcCA8LSBnZ3Bsb3QoZGF0YSwgYWVzKHggPSBgQXVyYWAsIHkgPSBgVE9WRGlmZmApKSArDQogIGdlb21faW1hZ2UoYWVzKGltYWdlID0gTG9nbyksIHNpemUgPSAwLjA3KSArIA0KICBsYWJzKA0KICAgIHggPSAiQXVyYSIsDQogICAgeSA9ICJUT1ZEaWZmIiwNCiAgICB0aXRsZSA9ICJBdXJhIHZzIFRPVkRpZmYiIA0KICApICsNCiAgdGhlbWUoDQogICAgcGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gIndoaXRlIiksDQogICAgcGxvdC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAid2hpdGUiKSwNCiAgICANCiAgICBheGlzLmxpbmUgPSBlbGVtZW50X2xpbmUoY29sb3IgPSAiYmxhY2siKSwNCiAgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMTIpLA0KICAgIGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMTIpLA0KICAgIA0KICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMTIsIGZhY2UgPSAiYm9sZCIsIGhqdXN0ID0gMC41KSwNCiAgICANCiAgICBwYW5lbC5ncmlkLm1ham9yID0gZWxlbWVudF9saW5lKGNvbG9yID0gImdyYXk5MCIpLA0KICAgIHBhbmVsLmdyaWQubWlub3IgPSBlbGVtZW50X2JsYW5rKCkNCiAgKQ0KDQpwcmludChwKQ0KDQpnZ3NhdmUoDQogIGZpbGVuYW1lID0gIkF1cmEgdnMgVE9WRGlmZi5wbmciLCANCiAgcGxvdCA9IHAsICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgZGV2aWNlID0gInBuZyIsICAgICAgICAgICAgICAgICAgICANCiAgd2lkdGggPSAxMCwgICAgICAgICAgICAgICAgICAgICAgICANCiAgaGVpZ2h0ID0gOCwgICAgICAgICAgICAgICAgICAgICAgIA0KICBkcGkgPSAzMDAgICAgICAgICAgICAgICAgICAgICAgICAgDQopDQpsaWJyYXJ5KGRwbHlyKQ0KZGF0YSA8LSByZWFkX2V4Y2VsKCJDOi9Vc2Vycy9DdXN0b20vRG9jdW1lbnRzL0NCQi9mdWxsc3RhdHMueGxzeCIpDQp4X2JhciA8LSBtZWFuKGRhdGEkYEF1cmFgLCBuYS5ybSA9IFRSVUUpDQp5X2JhciA8LSBtZWFuKGRhdGEkYFRPVkRpZmZgLCBuYS5ybSA9IFRSVUUpDQoNCmRhdGEgPC0gZGF0YSAlPiUNCiAgbXV0YXRlKA0KICAgIHhfZGlmZiA9IGBBdXJhYCAtIHhfYmFyLA0KICAgIHlfZGlmZiA9IGBUT1ZEaWZmYCAtIHlfYmFyLCAgDQogICAgc2NvcmUgPSBzaWduKHhfZGlmZiArIHlfZGlmZikgKiBzcXJ0KHhfZGlmZl4yICsgeV9kaWZmXjIpLA0KICAgIHNjb3JlX3JvdW5kZWQgPSByb3VuZChzY29yZSwgMSksDQogICAgYWNyb3NzKHdoZXJlKGlzLm51bWVyaWMpLCB+IHJvdW5kKC4sIDEpKQ0KICApDQpzY29yZV90YWJsZSA8LSBkYXRhICU+JQ0KICBzZWxlY3QoVGVhbSwgQXVyYSwgVE9WRGlmZiwgc2NvcmVfcm91bmRlZCkNCndyaXRlLmNzdihzY29yZV90YWJsZSwgIkM6L1VzZXJzL0N1c3RvbS9Eb2N1bWVudHMvQ0JCL3RlYW1fc2NvcmVzLmNzdiIsIHJvdy5uYW1lcyA9IEZBTFNFKQ0KYGBgDQoNCg==